// app/controller/import_controller.js
'use strict';

const { Controller } = require('egg');
const path = require('path');
const fs = require('fs').promises;

class ImportController extends Controller {
  // 导入银行流水
  async importBankTransactions() {
    const { ctx } = this;
    
    try {
      const stream = await ctx.getFileStream();
      const { importType } = stream.fields;
      
      // 生成唯一文件名
      const filename = `${Date.now()}_${stream.filename}`;
      const targetPath = path.join(ctx.app.config.uploadDir || './uploads', filename);
      
      // 确保上传目录存在
      await fs.mkdir(path.dirname(targetPath), { recursive: true });
      
      // 保存文件
      const writeStream = fs.createWriteStream(targetPath);
      stream.pipe(writeStream);
      
      // 等待文件写入完成
      await new Promise((resolve, reject) => {
        writeStream.on('finish', resolve);
        writeStream.on('error', reject);
      });
      
      // 处理文件内容
      const result = await ctx.service.importDataService.processBankTransactions(
        targetPath,
        importType
      );
      
      // 删除临时文件
      await fs.unlink(targetPath);
      
      ctx.success(result, '导入成功');
    } catch (error) {
      ctx.logger.error('导入银行流水失败:', error);
      ctx.error('导入银行流水失败: ' + error.message);
    }
  }
  
  // 获取导入模板
  async getTemplate() {
    const { ctx } = this;
    const { type } = ctx.params;
    
    try {
      // 使用Joi验证服务进行参数验证
      const schema = Joi.string().valid('zcy', 'standard').required();
      const validation = schema.validate(type);
      if (validation.error) {
        ctx.error(`参数验证失败: ${validation.error.message}`);
        return;
      }
      
      let templatePath;
      
      switch (type) {
      case 'zcy':
        templatePath = path.join(__dirname, '../../templates/zcy_template.xlsx');
        break;
      case 'standard':
        templatePath = path.join(__dirname, '../../templates/standard_template.xlsx');
        break;
      default:
        ctx.error('不支持的模板类型', 400);
        return;
      }
      
      // 检查模板文件是否存在
      try {
        await fs.access(templatePath);
        ctx.set('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
        ctx.set('Content-Disposition', `attachment; filename="${type}_template.xlsx"`);
        ctx.body = fs.createReadStream(templatePath);
      } catch (err) {
        ctx.error('模板文件不存在', 404);
      }
    } catch (error) {
      ctx.logger.error('获取导入模板失败:', error);
      ctx.error('获取导入模板失败: ' + error.message);
    }
  }
}

module.exports = ImportController;